welcome
本篇文章主要看看UniswapV2Pair的父类合约UniswapV2ERC20,主要学习一下eip712
UniswapV2ERC20
此合约如果熟悉ERC20 token的同学一定知道,她其实是标准的erc20合约(其标准的erc20合约的内容此处就不再详细介绍了)
但是相对标准的erc20合约多了一个permit方法,那么这个方法的作用是什么什么呢?其实是eip721的一个实现
1 | contract UniswapV2ERC20 is IUniswapV2ERC20 { |
UniswapV2ERC20中的eip712
- eip712其实是也是用你的私钥对一段文字进行签名,但是签名的过程中更加语义化,目前metamask已经支持,接下来看看premit中的核心方法
1 | bytes32 digest = keccak256( |
- 第一个参数 \x19\x01 固定值,为什么选择这个?请参考上面的链接
- 第二个参数:DOMAIN_SEPARATOR 其签名一般如下,固定值,在合约的构造函数中初始化,标志着只是eip712的实现
1 | // EIP712Domain(string name,string version,uint256 chainId,address verifyingContract) |
- 第三个参数的前段部分 PERMIT_TYPEHASH,与DOMAIN_SEPARATOR的含义类似,代表着这个函数的签名
- 第三个参数的后端部分统一理解为传进来signature对应的数据,此处用v,r,s代替
eip712的简单实现
此处采用的结构为 keccak256(‘Test(address owner,uint256 amount,uint256 nonce)’),此处注意数据类型和字段名中间有一个空格,参数之间的逗号之间没有空格
eip712主要功能是能够离线签名,让任意的人可以代替你做同样的事情,相当于授权.此处仅做演示签名后的地址正确性
此处仅测试验证结果成功即增加用户输入的amount
1 |
|
流程演示
这一周花了点时间用react做了个UI,使用了react + react-material开发UI,web3-react实现与区块链的交互xswap前端
- 使用remix部署合约在rinkeby测试链上,合约地址0x9F8C390b7048395d4DeBc7636031aD992115C303 ethersacn
- 从链上读出当前签名所用的nonce
- 根据nonce与amount使用账号进行签名,并发送到链上
- 当交易执行成功,获取新的nonce和amount,验证结果
- 再次执行签名,将获取的签名数据(其中如果数量为25,发送将会提醒失败,改为签名的数据19则正常弹出metamask)通过remix发送,等待交易结果后返回页面查询数据已经更改
js签名流程
目前web3不支持此类签名方式,metamask是支持的,请注意一下签名的请求方式
1 | // 两个字段 types与domain |
总结
- 关于语义化签名的就介绍到此了,那么uniswap中的permit的作用就是也就是如此,至于怎么使用它是怎么使用的呢,后续再看吧
- UniswapV2ERC20 基础合约就没有什么难点了,其余的方法为标准的erc20 token的方法
- 接下来讲解UniswapV2Factory,又是一个开发智能合约很重要的一个知识点呢
关于我
区块链程序猿一枚